package org.wheel.module.core.util;

import java.util.regex.Pattern;

/**
 * SQL 格式化工具
 * 1. compactSql(sql) → 压成一行，省内存；
 * 2. prettySql(sql) → 按关键字断行缩进，肉眼友好。
 */
public final class SqlFormatter {

    private static final Pattern WHITE = Pattern.compile("\\s+");

    /* 1. 关键字后换行：只把关键字本身拆出来，后面留一个空格再换行 */
    private static final Pattern NEWLINE_AFTER =
            Pattern.compile("\\b(SELECT|FROM|WHERE|LEFT|RIGHT|INNER|JOIN|ON|AND|OR|GROUP BY|ORDER BY|HAVING|LIMIT|UNION)\\b",
                    Pattern.CASE_INSENSITIVE);

    /* 2. 段首关键字：前面再补一次换行（让 WHERE/JOIN 等顶格） */
    private static final Pattern NEWLINE_BEFORE =
            Pattern.compile("\\s+(FROM|WHERE|LEFT|RIGHT|INNER|JOIN|GROUP BY|ORDER BY|UNION)",
                    Pattern.CASE_INSENSITIVE);

    /** 1. 简约一行版 */
    public static String compactSql(String sql) {
        return WHITE.matcher(sql.trim()).replaceAll(" ");
    }

    /** 2. 美化缩进版 */
    public static String prettySql(String sql) {
        // 1. 先压成一行
        String one = compactSql(sql);

        // 2. 关键字后留一个空格再换行
        String step1 = NEWLINE_AFTER.matcher(one)
                .replaceAll("$1 \n");     // SELECT \n  * \nFROM \n  user \nWHERE

        // 3. 段首关键字前再换行（顶格）
        String step2 = NEWLINE_BEFORE.matcher(step1)
                .replaceAll("\n$1");     // FROM / WHERE 等顶格

        // 4. 按行输出即可
        return step2.trim();
    }

    private SqlFormatter() {}
}
